// 第06节：函数中变量的作用域


// 函数作用域演示
    // 我们来举个例子，现在要制作一个整形的方法，然后在函数里用var定义一个yangzi的变量,我们再函数的外部读取这个变量，你会发现是读取不到的。
// function zhengXing():void{
//     var yangzi = '刘德华'
//     console.log(yangzi)
// }
// zhengXing()
// console.log(yangzi)


// 认识全局变量和局部变量
    // 局部变量：函数体内定义的变量就是局部变量。
    // 全局变量: 函数体外 定义的变量就是全局变量。

    // 我们改造上边的程序，把yangzi办理移动到全局，然后再进行输出。

    // var yangzi = '刘德华'
    // function zhengXing():void{
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    // }
    // zhengXing()
    // console.log(yangzi)
    // 这时候yangzi变量是全局的，所以在函数内也可以调用，在函数外也可以调用。


// 局部变量和全局变量重名
    // 当局部变量与全局变量重名的时候，在函数体内是局部变量起作用；如果重名，就有变量提升，这是一个坑，小伙伴们必须要注意

    // 还是上边整形的例子，技术胖是想整形成刘德华，但是函数体内部声明了一个马德华。虽然一字之差，但是样子可是完全不同的。我们来看代码如何实现：
    // var yangzi:string = '刘德华'
    // function zhengXing():void{
    //     var yangzi:string = '马德华'
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    // }
    // zhengXing()
    // console.log(yangzi)
    // 这回你会发现，技术胖并没有变成刘德华而是变成了马德华。那你说我我想变成刘德华，我在函数没声明新变量前打印到控制台行不行？

    // var yangzi:string = '刘德华'
    // function zhengXing():void{
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    //     var yangzi:string = '马德华'
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    // }
    // zhengXing()
    // console.log(yangzi)
    // 代码改造成了这样，但是你会发现，我们输出的结果如下：
    // 技术胖整形成了undefined的样子

    // var yangzi:string = '刘德华'
    // function zhengXing():void{
    //     var  yangzi:string 
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    //     yangzi = '马德华'
    //     console.log('技术胖整形成了'+yangzi+'的样子')
    // }
    // zhengXing()
    // console.log(yangzi)
    // 也就是当内部声明了和全局的变量同名时，就会出现变量提升的效果，声明语句会提升到函数的第一句。这就是著名的变量提升效果。


// let关键字变量的作用域
    // 在早期javascript的变量作用域只有全局和局部，并且是以函数划分的，但在其他语言中，作用域的划分是以一对大括号作为界限的。
    // 所以，JavaScript就遭到了无数开发者的吐槽，甚至说javascript不适合开发大型语言，容易内存溢出。JavaScript团队意识到了这一点，在ES6中推出了let关键字。
    // 使用let关键字的变量就是一个块级作用域变量。希望大家在实际工作中多使用let来声明你的变量，让你的程序更有条例。 来看一端程序：

function zhengxing():void{
    var yangzia:string='刘德华'
    {
        let yangzib:string='周德华'
        console.log('我整容成了'+ yangzib)
    }
    console.log('我整容成了'+yangzia)
    console.log('我整容成了'+yangzib)
}
zhengxing()